上回我們利用了PowerShell來執行我們產出的多條命令列,現在我們可以不用透過開啟SSMS來執行SQL命令以及.sql腳本,不過如果我們執行的命令列順序有瑕疵或是錯誤,途中可能造成中斷或是錯誤的預期結果。
上回我們的ps1檔案邏輯如下:
1.新增資料庫
2.將腳本寫進目標資料庫
sqlcmd -S . -Q "CREATE DATABASE One"
sqlcmd -S . -d One -i C:\temp\FirstDataBase.sql
假設我們將內容故意寫錯而變成不合理的情形,如下:
sqlcmd -S . -Q "DROP DATABASE One"
sqlcm -S . -Q "CREATE DATABASE One"
sqlcmd -S . -d One -i C:\temp\FirstDataBase.sql
利用PowerShell ISE執行可以看到會發生錯誤,雖然不會讓整個執行緒中斷,但是最後結果會發現腳本資料沒有寫進資料庫中。
在開發的過程中經常必須考慮發生例外的情形,除了正確回報錯誤訊息外,若能適當地處理例外,可以大幅減少開發或維運人員的調查成本。
對於上述的情形,因情境較為單純,假設我們想要而外做的處理如下:
1.回報錯誤訊息
2.若執行腳本時發現資料庫不存在,就改為先新增資料庫再重新執行腳本
讓我們試試看使用Try-Catch來完成上述情境,程式碼如下:
Try
{
#主要程式邏輯,採用原本有瑕疵的程式
sqlcmd -S . -Q "DROP DATABASE One"
sqlcm -S . -Q "CREATE DATABASE One"
sqlcmd -S . -d One -i C:\temp\FirstDataBase.sql
}
Catch
{
#因能預期是發生甚麼錯誤,所以直接回報錯誤情形
Write-Output "資料庫新增失敗,已重新處理"
sqlcmd -S . -Q "CREATE DATABASE One"
sqlcmd -S . -d One -i C:\temp\FirstDataBase.sql
Write-Output "資料重新處理完成"
}
完成執行後透過PowerShell ISE的訊息或是開啟SSMS查看是否成功,另外也能將主要程式邏輯改成正確的,再驗證是否會走到Catch那段。
更多小知識,我們下次見~~